module.exports = (app) => {
    // 定义子路由
    const express = require('express')
    const jwt = require('jsonwebtoken')
    const assert = require('http-assert')
    const AdminUser = require('../../model/AdminUser')
    const router = express.Router({
            mergeParams: true
        })
        // 改大小写用
    const inflection = require('inflection')

    // 通用的CRUD接口的编写
    router.post('/', async(req, res) => {
        // mongoose的操作是异步操作
        const model = await req.Model.create(req.body)
        res.send(model)
    })
    router.get('/', async(req, res) => {
        const queryOptions = {}
        if (req.Model.modelName === 'Category') {
            queryOptions.populate = 'mainClassify'
        }
        const model = await req.Model.find().setOptions(queryOptions).limit(100)
        res.send(model)
    })
    router.get('/:id', async(req, res) => {
        const model = await req.Model.findById(req.params.id)
        res.send(model)
    })
    router.put('/:id', async(req, res) => {
        const model = await req.Model.findByIdAndUpdate(req.params.id, req.body)
        res.send(model)
    })
    router.delete('/:id', async(req, res) => {
        await req.Model.findByIdAndDelete(req.params.id)
        res.send({
            success: true
        })
    })

    // 子路由挂载上去，另外有两个中间件
    app.use('/admin/api/rest/:resource', (req, res, next) => {
        const token = req.headers.authorization
            // 抛出异常
        assert(token, 401, '请提供jwt token')
        const { id } = jwt.verify(token, app.get('secret'))
            // 抛出异常
        assert(id, 401, '无效的jwt tkoen')
        req.user = AdminUser.findById(id) //挂到req上的话，全局都能用
            // 抛出异常
        assert(req.user, 401, '请先登录')
        next()
    }, (req, res, next) => {
        const modelName = inflection.classify(req.params.resource)
            // 这边如果const的话，后面的中间件是调用不到的，所以我们把他挂到req上
        req.Model = require(`../../model/${modelName}`)
        next()
    }, router)

    // 上传图片的接口
    const multer = require('multer')
    const upload = multer({ dest: __dirname + '/../../upload' })
    app.post('/admin/api/upload', upload.single('file'), (req, res) => {
        const file = req.file
        file.url = `http://localhost:3000/uploads/${file.filename}`
        res.send(file)
    })

    // 登录的接口
    app.post('/admin/api/login', async(req, res) => {
        const { username, password } = req.body

        // 第一步：根据用户名找用户
        const user = await AdminUser.findOne({ username: username }).select('+password')
            // if (!user) {
            //     // 如果用户不存在，发送错误状态码
            //     return res.status(422).send({
            //         message: '用户不存在'
            //     })
            // }
        assert(user, 422, '用户不存在')

        // 第二步：校验密码
        const isValid = require('bcryptjs').compareSync(password, user.password) // 解密环节，比较明文（第一个参数）和密文（第二个参数）
            // if (!isValid) {
            //     return res.status(422).send({
            //         message: '密码错误'
            //     })
            // }
        assert(isValid, 422, '密码错误')

        // 第三步：返回token
        const token = jwt.sign({ id: user._id }, app.get('secret'))
        return res.send({ token: token })
    })


    // 捕获异常,错误处理
    app.use((err, req, res, next) => {
        res.status(err.statusCode).send({
            message: err.message
        })
    })
}